package com.hliushi.learn.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;


/**
 * 开启快速失败返回模式
 * 当校验对象中的所有字段属性, 当遇到第一个不合法的字段,
 * 后面的所有字段, 不再校验, 直接把错误信息返回给前端
 *
 * @author llhuang10
 * @date 2021/8/24 10:00
 */
//注意点, 类加上了这个 @Configuration注解, 就表示所有的 校验都是快速失败模式
//  但是如果不加上这个 @Configuration这个注解, 这个类就不是配置类, 里面的@Bean就无法注入到容器中
// @Configuration
public class ValidatorConfiguration {

    /**
     * 表单中有两个错误格式的字段, 一个是email格式不正确, 另一个是phone字段
     * {
     * .  "personId": "00001",
     * .  "name": "hliushi",
     * .  "sex": "Man",
     * .  "email": "demoData",
     * .  "phone":" 110"
     * }
     * 开启注解 @EnableFormValidator
     * ex打印输出为:
     * with 1 error(s): [Field error in object 'person' on field 'phone': rejected value [ 110]
     * #
     * 关闭注解 @EnableFormValidator
     * ex打印输出为:
     * with 2 error(s): [Field error in object 'person' on field 'phone':  default message [phone],
     * .                [Field error in object 'person' on field 'email': rejected value [demoData]
     */

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation.byProvider(HibernateValidator.class)
                        .configure()
                        //快速失败返回模式
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    /**
     * 开启快速返回
     * 如果参数校验有异常，直接抛异常，不会进入到 controller，使用全局异常拦截进行拦截
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor =
                new MethodValidationPostProcessor();
        /**设置validator模式为快速失败返回*/
        postProcessor.setValidator(validator());
        return postProcessor;
    }

}
